package com.cskaoyan.javase.thread._1extends;

import org.junit.Test;

import java.util.concurrent.TimeUnit;

/**
 * 使用方式一实现多线程,启动了一条新的执行路径
 * 启动main方法,并且在main方法中再启动一个线程:
 * 1.启动main方法就是运行一个Java程序，也就是在操作系统中启动了一个Java进程。
 * 而Java程序是执行于JVM当中的，所以一个Java进程，实际上是一个JVM的进程。
 *
 * 2.main方法是程序的入口方法，main方法的执行代表了这个Java进程中的一条执行路径，也就是一个线程。我们一般称呼main方法执行的线程是“主线程”，其它线程为“子线程”。main方法执行意味着主线程启动，主线程是一个Java进程执行中的一条主要路径。
 *
 * 3.在main方法中又开启了一个线程，这个线程是主线程当中新建的子线程。子线程的开启意味着该Java进程中开辟了一条新的执行路径，这条新的执行路径和原先的主路径可以“并发执行”。
 *
 * 注意事项:
 *      1.在main方法中又开启了一个线程，这个线程是主线程当中新建的子线程。子线程的开启意味着该Java进程中开辟了一条新的执行路径，这条新的执行路径和原先的主路径可以“并发执行”。
 *      2.即便主线程已经执行完毕了,但是进程仍不会结束,还会等待子线程执行完毕.
 *      3.主线程当中可以启动多个子线程，子线程当中又可以继续启动子线程，它们的执行仍然符合上述规律。
 *
 *
 * run方法和start方法的区别:
 *      start方法的作用是通过一个本地方法启动一个新的线程,启动这个线程以后
 *      JVM会自动调用该线程的run方法
 *
 *      run方法就只是一个普通的成员方法,没有任何特殊性
 *
 *
 * @since 15:50
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Notice {
    // @Test
    // public void test() {
    //     // 这种方式也确实可以启动一个线程,但是run方法不执行任何内容,这个线程是没有意义的,不要这么做!
    //     Thread t = new Thread();
    //     t.start();
    // }

    // @Test
    // public void test2() {
    //     new ThreadB().start();
    // }


    /*
        在本代码案例中
        主线程先执行,启动main方法
        然后在main方法中启动一个线程A
        在线程A中又启动了一个线程B
        于是:
        主线程,线程A,线程B三个线程就并发执行
        它们执行的特点是什么样的呢?有什么规律嘛?
     */
    public static void main(String[] args) {
        // new ThreadB().start();
        new ThreadB().run();
        for (int i = 0; i < 6; i++) {
            System.out.println("hello world!");
            // try {
            //     // 暂停2s
            //     TimeUnit.SECONDS.sleep(2);
            // } catch (InterruptedException e) {
            //     e.printStackTrace();
            // }
        }
    }
}

class ThreadB extends Thread {
    @Override
    public void run() {
        new ThreadC().start();
        for (int i = 0; i < 60; i++) {
            System.out.println("这是第" + (i + 1) + "次！");
            // try {
            //     // 暂停2s
            //     TimeUnit.SECONDS.sleep(2);
            // } catch (InterruptedException e) {
            //     e.printStackTrace();
            // }
        }
    }
}

class ThreadC extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 60; i++) {
            System.out.println("你真6!");
            // try {
            //     // 暂停2s
            //     TimeUnit.SECONDS.sleep(2);
            // } catch (InterruptedException e) {
            //     e.printStackTrace();
            // }
        }
    }
}